import type { BabelPresetOptions, EnvironmentType, PresetEnvConfig, JsxConfig, ReactVersion } from './types'

/**
 * 解析React版本号
 */
export function resolveReactVersion(version?: ReactVersion): '17' | '18' {
    if (!version) return '18' // 默认使用最新稳定版

    const strVersion = typeof version === 'number' ? version.toString() : version

    if (strVersion.startsWith('17')) return '17'
    return '18'
}

/**
 * 根据环境类型和React版本解析目标环境配置
 */
export function resolveTargets(
    targets?: BabelPresetOptions['targets'],
    envType?: EnvironmentType,
    reactVersion?: ReactVersion
): PresetEnvConfig['targets'] {
    // 如果用户明确指定了targets，直接使用
    if (targets && targets !== 'es5' && targets !== 'es6' && targets !== 'node') {
        return targets
    }

    const resolvedReactVersion = resolveReactVersion(reactVersion)
    const isNodeEnv = envType?.includes('node')
    const isLib = envType?.includes('lib')
    const isH5 = envType?.includes('h5')

    // Node环境目标配置
    if (isNodeEnv) {
        return targets === 'node' ? 'node >= 18' : targets
    }

    // H5环境目标配置
    if (isH5) {
        // 库模式需要更广泛的兼容性
        if (isLib) {
            return targets === 'es5'
                ? ['last 3 versions', '> 0.5%', 'ie >= 11']
                : ['last 2 versions', '> 1%', 'not dead', 'not ie <= 11']
        }

        // 普通H5环境
        return targets === 'es5'
            ? ['last 2 versions', '> 1%', 'ie >= 11']
            : ['last 2 versions', '> 1%', 'not dead', 'not ie <= 11']
    }

    // React/Preact环境目标配置
    if (targets === 'es5') {
        // React 17仍然支持IE 11
        if (resolvedReactVersion === '17') {
            return [
                'ie 11',
                'chrome >= 55',
                'firefox >= 52',
                'safari >= 10',
                'edge >= 15',
                'ios >= 10',
                'android >= 6'
            ]
        }

        // React 18不再支持IE 11
        return [
            'chrome >= 60',
            'firefox >= 55',
            'safari >= 11',
            'edge >= 16',
            'ios >= 11',
            'android >= 7'
        ]
    }

    // ES6目标配置 - 现代浏览器
    return [
        'last 2 years',
        '> 1%',
        'not dead',
        'not ie <= 11',
        'not op_mini all',
        'fully supports es6-module'
    ]
}

/**
 * 解析模块类型
 */
export function resolveModules(
    modules?: BabelPresetOptions['modules'],
    envType?: EnvironmentType
): PresetEnvConfig['modules'] {
    // 用户明确指定则使用用户配置
    if (modules !== undefined) {
        return modules
    }

    // 库类型默认使用ES模块
    if (envType?.includes('lib') || envType?.includes('esm')) {
        return false
    }

    // Node环境默认使用CommonJS
    if (envType?.includes('node')) {
        return 'commonjs'
    }

    // H5环境默认自动处理
    if (envType?.includes('h5')) {
        return 'auto'
    }

    // 默认自动处理
    return 'auto'
}

/**
 * 构建预设环境配置
 */
export function buildPresetEnvConfig(
    envType: EnvironmentType,
    targets: PresetEnvConfig['targets'],
    modules: PresetEnvConfig['modules'],
): PresetEnvConfig {
    const isLib = envType.includes('lib')
    const isNode = envType.includes('node')
    // 基础配置
    const config: PresetEnvConfig = {
        modules,
        targets
    }

    // React 18+在现代环境下可以减少polyfill
    if (!isLib && !isNode) {
        config.useBuiltIns = 'usage'
        config.corejs = 3
    }
    // H5库模式优化
    if (isLib) {
        config.useBuiltIns = false
    }
    // Node环境不需要自动注入polyfill
    if (isNode) {
        config.useBuiltIns = false
    }

    return config
}

/**
 * 解析JSX配置
 */
export function resolveJsxConfig(envType?: EnvironmentType, jsxImportSource?: string): JsxConfig | null {
    const isReact = envType?.includes('react') && !envType.includes('h5')
    const isPreact = envType?.includes('preact') && !envType.includes('h5')

    // H5环境不使用JSX配置
    if (envType?.includes('h5')) {
        return null
    }

    if (!isReact && !isPreact) {
        return null
    }

    return {
        runtime: 'automatic',
        importSource: jsxImportSource || (isPreact ? 'preact' : 'react'),
        development: process.env.NODE_ENV === 'development'
    }
}



/**
 * 检查是否需要使用transform-runtime插件
 */
export function shouldUseTransformRuntime(
    envType?: EnvironmentType,
    modules?: PresetEnvConfig['modules'],
    explicitFlag?: boolean
): boolean {
    // 显式指定则使用显式值
    if (explicitFlag !== undefined) {
        return explicitFlag
    }

    // 库模式默认使用
    if (envType?.includes('lib')) {
        return true
    }

    // 非ES模块模式使用：先通过类型守卫区分modules类型，避免类型冲突
    if (modules !== undefined) {
        // 1. 先判断是否为boolean类型（modules: false 表示保留ES模块，不转换）
        if (typeof modules === 'boolean') {
            // boolean类型下，只有 modules: false 是ES模块，其他情况（理论上无）均为非ES模块
            return !modules
        }
        // 2. 再判断是否为string类型（排除 'esm' 以外的字符串均为非ES模块）
        if (typeof modules === 'string') {
            return modules !== 'esm'
        }
    }

    // 默认：非ES模块场景（兜底）
    return false
}
